Object-C 学习笔记(五)---构造方法

原创 2013年12月02日 16:44:41

说到构造方法,我很想吐槽,Object-C是一种面相对象的语言,但是感觉OC自立门户,思想一致,语法奇葩.

(1) 由C语言发展而来,却抛弃了世界统一的写法.

(2)大家都知道C++是既面向过程,也面向对象,但是新版的C++都完全面相对象,封装程度跟java和C#差不多,但是Object-C居然比C++封装程度还低.

今天发现,OC连构造方法都要自定义

例子:

//
//  People.h
//  Constructor
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject

//属性声明
//引用型使用retain,基本数据类型使用:assign
//nonatomic 非原子性操作(引起线程安全问题);atomic 原子性操作
@property(retain,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@property(retain,nonatomic)NSString *school;

//构造方法自定义
-(People *)initWithName:(NSString*) name
                 andAge:(NSInteger) age
              andSchool:(NSString*) school;

+(People *)PeopleWithName:(NSString*) name
                   andAge:(NSInteger) age
                andSchool:(NSString*) school;
//无参构造方法
+(People *)_People;

@end

//
//  People.m
//  Constructor
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People

//使用属性定义,自动生成getter和setter
@synthesize name = _name;
@synthesize age = _age;
@synthesize school = _school;

//自定义无参构造方法
+(People *)_People
{
    People* person = [[People alloc] init];
    return [person autorelease];//放入自动释放池
}

//构造方法自定义 不使用@synthesize 
-(People *)initWithName:(NSString*) name
                 andAge:(NSInteger) age
              andSchool:(NSString*) school
{
    if(self = [super init])
    {
        self.name = name;
        self.age = age;
        self.school = school;
    }
    
    return self;
}

+(People *)PeopleWithName:(NSString*) name
                   andAge:(NSInteger) age
                andSchool:(NSString*) school
{
    People * person = [[People alloc] initWithName:name andAge: age andSchool:school];
    return [person autorelease];//放入自动释放池
}

@end

//
//  main.m
//  Constructor
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[])
{

    //无参构造方法
    People* person1 = [People _People];
    person1.name = @"DRAGON";
    person1.age = 23;
    person1.school = @"GDOU";
    NSLog(@"我是%@,今年%ld岁,就读于%@.",person1.name,person1.age,person1.school);
    //带参构造方法
    People* person2 = [People PeopleWithName:@"XX" andAge:18 andSchool:@"SCNU"];
    NSLog(@"我是%@,今年%ld岁,就读于%@.",person2.name,person2.age,person2.school);

    return 0;
}

以上是笔者仿照别的高级语言里,使用一个(-)类方法,加上一个(+)静态方法,结合起来做成一个构造方法,这样看起来可读性就好多了.

其实原理是借助一个类方法初始化对象,然后使用静态方法返回.但是要注意的是,返回对象引用的同时需要把引用设置成autorelease

Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。

在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,

按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露

有什么区别?

答案:对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象

CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个

pool里的每个Object会被release。





CAN总线学习笔记

1.总线状态  总线有“显性”和“隐性”两个状态,“显性”对应逻辑“0”,“隐性”对应逻辑“1”。“显性”状态和“隐性”状态与为“显性”状态,所以两个节点同时分别发送“0”和“1”时,总线上呈现“0”...
  • coolibin
  • coolibin
  • 2014年05月30日 09:47
  • 1738

PackageManagerService学习笔记五-构造方法

构造方法部分代码:
  • u013378953
  • u013378953
  • 2014年02月06日 16:18
  • 804

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西。但靠这些知识还是不能看懂PySide使...
  • dbzhang800
  • dbzhang800
  • 2011年04月22日 12:05
  • 8171

IOS开发基础Object-C( 04)—构造方法和description方法

在上一篇博客中,我们简单介绍了一下点语法和self,相信大家对点语法以及self有了一点的了解,点语法的本质就是调用get方法和set方法。那么今天我们再来介绍一下构造方法和description。 ...
  • u010037928
  • u010037928
  • 2015年11月01日 11:51
  • 2335

Junit学习笔记之一:junit的安装和测试原则

单元测试    1、自动化测试      1.1、通过断言的方式来确定结果是否正确Assert      1.2、引入junit的jar包      1.3、创建一个操作类    2、基于测试开发的方...
  • xiao_xuwen
  • xiao_xuwen
  • 2016年10月21日 22:50
  • 379

机器学习笔记(五) octave入门

这一节我们主要用来熟悉octave的使用。    octave和matlab一样,主要用来数值计算和仿真。尤其精于矩阵运算:求解联立方程组,计算矩阵特征值和特征向量等等。       矩阵大小...
  • qq_41051855
  • qq_41051855
  • 2017年11月30日 16:40
  • 114

黑马程序员--Object-C构造方法

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 下面是OC的一些注意点: @interface 类型声明,类似于c++中的class,区别在...
  • Sanglong117
  • Sanglong117
  • 2015年04月19日 21:40
  • 256

黑马程序员-Object-C之构造方法

---------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!---------------------------...
  • myenglish5
  • myenglish5
  • 2014年06月22日 23:08
  • 239

Objective-C学习笔记和IOS入门

1. main(int argc, char * argv[]){} (因为程序名总是用作启动参数传递,所以argc的值至少是1) 2. NSLog(@"some strings"); @"" ...
  • wen942467928
  • wen942467928
  • 2016年05月09日 14:14
  • 1001

cmake 学习笔记(六)

希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest。 简单使用 最简单的使用ctest的方法,就是...
  • dbzhang800
  • dbzhang800
  • 2011年04月22日 15:12
  • 6878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-C 学习笔记(五)---构造方法
举报原因:
原因补充:

(最多只允许输入30个字)