[OC笔记]@property之个人理解,大神轻拍

/**
 * 一个简单的对象
 * 
 * @author suzhen
 * 
 */
public class SimpleObjcet {
    /**
     * 声明一个age字段
     */
    private Object obj;

    /**
     * 取方法
     * 
     * @return
     */
    public Object getObj() {
        return obj;
    }

    /**
     * 存方法
     * 
     * @param obj
     */
    public void setObj(Object obj) {
        this.obj = obj;
    }
}

 

//这是一段简单的java代码,展示了如何去通过存/取这个obj字段。

@property是OC语言里面的属性的意思,因为通过它,咱们可以方便的访问OC的字段,用别的语言的说法就是getter和setter或者存取方法。但是因为OC需要自己来管理内存,OC因此和别的语言又不太一样。

既然说了OC的与众不同,那在OC里面该咱们写呢? 

下面我就来展示最原始的写法吧。这是一个book的头文件

//
//  Book.h
//  StudentAndBook
//
//  Created by Suzhen on 14-3-16.
//  Copyright (c) 2014年 Suzhen. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface Book : NSObject
//这里放置对象的声明 { //访问修饰符 @private //content就是书本的内容,暂时不要在意编译器的警告^.^ NSString* _content; //pages是书本的页数 int _pages; } //存取方法的声明 getter,setter -(void)setContent:(NSString*)mContent; -(NSString*) getContent; //pages的存取方法 -(void)setpage:(int)mContent; -(int) getPages; //book的构造方法   -(id)initWithPages:(int)pages andContents:(NSString*)content; @end

 下面的是BOOK的实现文件

//
//  Book.m
//  StudentAndBook
//
//  Created by Suzhen on 14-3-16.
//  Copyright (c) 2014年 Suzhen. All rights reserved.
//

#import "Book.h"

@implementation Book

//这就相当于一个构造函数,用来初始化一个对象
-(id)initWithPages:(int)pages andContents:(NSString *)content{
    if(self = [super init]){
        [self setContent:content];
        [self setpage:pages];
    }
    return self;
    
}
//一个对象引用计数器归零的时候会调用
-(void)dealloc{
    NSLog(@"销毁了书本>>");
    [[self getContent]release];
    [super dealloc];
}
//page的set方法
-(void)setpage:(int)pages{
    _pages=pages;
}
//content的set方法
-(void)setContent:(NSString *)mContent{
    if(mContent!=_content){
        [_content release];
        [mContent retain];
    }
    _content=mContent;
}
//pages的get方法
-(int)getPages{
    return _pages;
}
//content的get方法
-(NSString *)getContent{
    return _content;
}
//描述,相当于java里面的tostring
-(NSString *)description{
    return [self getContent];
}
@end

这样咱们就能安全的设置和获得这个Book中的属性了。

这样写其实还是很麻烦的,比较是咱们自己实现的方法,这样做太冗余了,如果book中又多个属性,那我们岂不是要写无数个存储方法?这样做一是很没有必要,二辉产生大量垃圾代码。

为了解决这个问题,OC给咱们设置了更加简单的方法

我们可以直接使用@property来直接声明一个字段,并且这个字段Xcode也会给咱们生成相应的存取方法。这样做不就简单多了呢?

#import <Foundation/Foundation.h>
//告诉编译器,有BOOK这个类的存在
//其实你也可以直接import这个book.h
//但是这样做性能更加好~
//@protocol同理,这个后面的文章会说到
@class  Book;

@interface Student : NSObject
//字段声明,这个的意思其实和Book类的声明是一个意思
//但是系统会给咱们自动生成存取方法,是不是更加方便呢
//当然了不会这么简单的,@property后面括号里面的属性还是很讲究的
@property(nonatomic,assign) int sid;
//这个对象就像是Book的content一样
//这段代码展开之后和那里面Book的Content的存取方法基本是一样的
@property(nonatomic,retain) Book* mBook;


-(id)initWithId:(int)sid;

-(void)keepBook:(Book*)mBook;

@end

咱们只要声明sid,和mBook,就可以直接使用了(在高版本的xcode中咱们甚至连@synthesize都可以直接省略不写)

这么一来,咱们的编程效率可以更高了。为啥咱们这样做是对的呢?其实在xcode内部,早就给咱们自动展开代码了

真正的Student类其实是这样的

咱们可以这样展开:

@property(nonatomic,assign) int sid;展开为(括弧里面的属性暂时先别管咯)

int _sid;

@property(nonatomic,retain) Book* mBook;展开为

Book* _mBook;

前面的下划线就是xcode给咱们自动添上的,

在Student的实现文件中就会相应的展开存取方法

咱们就挑选mBook的存取方法来说一下

-(void)setmBook: (Book*) mBook{

  if( _mBook!=mBook){

    [_mBook release];

    _mBook= [mBook retain];

   }

}

这样子一展开,大家应该基本对@property有一个基本的了解了呢?

大家一起加油学习OC吧,楼主也是个新手,各位大神轻拍哦有错误咱们会第一时间更正的~

 

转载于:https://www.cnblogs.com/louzhuhaha/p/3606002.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值