`
百合不是茶
  • 浏览: 344947 次
社区版块
存档分类
最新评论

oc类和对象的创建和NSLog输出

阅读更多

oc和java的语法区别比较大,所以进度有点慢:重点在于基础

 

一:调试基础 输出语句oc基本与c相似,与java就有很大的不同(java直接是System.out.println("");)

字符串不是几本数据类型,所以需要使用NSLog(@"%@",name);输出,切记

 

OC中NSLog函数输出格式详解
%@ 对象
• %d, %i 整数
• %u 无符整形
• %f 浮点/双字
• %x, %X 二进制整数
• %o 八进制整数
• %zu size_t
• %p 指针
• %e 浮点/双字 (科学计算)
• %g 浮点/双字
• %s C 字符串
• %.*s Pascal字符串
• %c 字符
• %C unichar
• %lld 64位长整数(long long)
• %llu 无符64位长整数
• %Lf 64位双字

  

 

 

二:类和对象的创建(这里只是记录h,m,main三个文件之间的关联,内存的申请和释放以后会专门的研究)

oc与java不同,java类的实现和声明都是在一个文件中而oc类的声明在.h文件中,实现在.m文件中也就是说一个oc类需要有两个文件,这真它妈蛋疼啊,

 

java引入类import android.app.*;

 

oc引入类 #import "Student.h" 

 

 

Student.h文件声明类及属性,方法

 

//
//  Student.h
//  test_01
//
//  Created by wang on 15/11/1.
//  Copyright © 2015年 wang. All rights reserved.
//

#ifndef Student_h
#define Student_h

@interface Student : NSObject{
    
    int age;
    NSString* name;
    int address;
    
}
//h文件中定义参数时,必须要实现该参数的方法如age -(int)age,下面实现了age和name的方法,可以在main文件中使用对象来传递消息,address没有实现 则无法通过消息来传递
-(int)age;
-(NSString*)name;
-(int)address;
- (void)setAge:(int)newAge;//定义方法
- (void)addName:(int)newName;
- (void)setAddress:(int)address;
-(void)setName:(NSString*)newName andAge:(int)newAge setAddress:(int)newAddress;//oc对象的创建的对象都是指针对象


@end
#endif /* Student_h */

 注意:

 

 

   1. @interface --------> 等于java中的class

     2. 类名后的冒号:---------> 等于java中的extends

     3. 函数前面的减号-  ---------> 表示对象方法

     4函数前面的加号+  ---------> 表示类方法,等于java的static方法

     5. 函数的返回类型和参数的类型必须用括号,形参用冒号:表示

 

NSString* name;类似于java的String name;

 

 

Student.m实现Student.h中定义的方法

 

//
//  Student.m
//  test_01
//
//  Created by wang on 15/11/1.
//  Copyright © 2015年 wang. All rights reserved.
//

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

@implementation Student

// m 文件时实现其具体的方法等
// h 文件时定义方法和变量等

//-(void) 类似于java的private私有的
//+(void) 类似于java的static方法,类方法

//java对方法的使用叫调用,oc称为消息的传递

    -(int)age{
        return age;//获得age
    }
-(int)address{
    return address;//获得age
}
-(NSString*)name{
    return name;
}

-(void)setAge:(int)newAge{
    age=newAge; //将传入的newAge的值赋给age
}

//定义方法
-(void)setName:(NSString *)newName andAge:(int)newAge setAddress:(int)newAddress{
    name=newName;
    age=newAge;
    address=newAddress;
    
}


@end

 

Student.m文件必须是 @implementation开头 @end结尾  这里要和java的定义接口和实现接口区别开

 

oc的程序入口和java类似都是mian函数

 

 

//
//  main.m
//  test_01
//
//  Created by wang on 15/11/1.
//  Copyright © 2015年 wang. All rights reserved.
//

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {//自动回收池
        
        
        
        Student* st=[[Student alloc]init];
        [st setAge:(100)];
        NSString* sname=@"百合不是茶";
        
        [st setName:(sname) andAge:(99) setAddress:(23)];
        NSLog(@"name=%@",st.name);
        NSLog(@"name:%@",[st name]);
        NSLog(@"%d",[st age]);
        NSLog(@"%d",st.address);//由于没有在h文件中实现其方法,无法通过编译
        NSLog(@"%d",st.address);
        
//        NSLog(@"%@",st->name);//默认属性时protected所以无法打印
        
        // insert code here...
        NSLog(@"Hello, World!");//字符串的打印
        for (int n=0; n<10; n++) {
//            NSLog(@"第一次写oc的程序,有点小激动是吧。。。。。");
        }
        BOOL b=2;//bool类型的打印
        NSLog(@"BOOL--b-->%s",b?"YES":"NO");//打印字符串
        NSLog(@"BOOL--b-->%@",b?@"YES":@"NO");//打印对象
        NSLog(@"BOOL--b-->%d",b);//打印数字s
        //浮点单精度打印
        float f=23.00;
        
        NSLog(@"float=%f",f);
        
//        双精度
        double d=32;
        NSLog(@"double=%g",d);
        
        //对象
        NSString* s1=@"wang";
        NSLog(@"s1=%@",s1);
        
    //定义char数组并输出
        char* c[4]={"nihao","hello_java","hello_Android","hello_Object-c"};
        for (int n=0; n<4; n++) {
            NSLog(@"%s",c[n]);
        }
        
        
    }
    return 0;
}

 运行结果:

2015-11-01 19:01:22.951 test_01[1651:118415] name=百合不是茶
2015-11-01 19:01:22.952 test_01[1651:118415] name:百合不是茶
2015-11-01 19:01:22.952 test_01[1651:118415] 99
2015-11-01 19:01:22.952 test_01[1651:118415] 23
2015-11-01 19:01:22.952 test_01[1651:118415] 23
2015-11-01 19:01:22.952 test_01[1651:118415] Hello, World!
2015-11-01 19:01:22.952 test_01[1651:118415] BOOL--b-->YES
2015-11-01 19:01:22.952 test_01[1651:118415] BOOL--b-->YES
2015-11-01 19:01:22.952 test_01[1651:118415] BOOL--b-->2
2015-11-01 19:01:22.952 test_01[1651:118415] float=23.000000
2015-11-01 19:01:22.952 test_01[1651:118415] double=32
2015-11-01 19:01:22.952 test_01[1651:118415] s1=wang
2015-11-01 19:01:22.952 test_01[1651:118415] nihao
2015-11-01 19:01:22.952 test_01[1651:118415] hello_java
2015-11-01 19:01:22.953 test_01[1651:118415] hello_Android
2015-11-01 19:01:22.953 test_01[1651:118415] hello_Object-c
Program ended with exit code: 0

 

 

oc对象的创建需要手动申请和释放,由于使用了自动回收池就没有手动释放  [st release]

 

 Student* st=[[Student alloc]init];

   java创建对象 Student st =new Student();

 

  oc消息的传递

   [st setAge:(100)]; /调用方法,传递参数

  java的调用

   st.setAge(100);

 

 

注意:如果在Student.m文件中未实现address和name的方法,mian文件中是无法打印出值的会出现运行时异常

-(int)address{

    returnaddress;//获得age

}

-(NSString*)name{

    return name;

 

}

 

异常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Student name]: unrecognized selector sent to instance 0x1006001c0'

 

*** First throw call stack:

 

 

 

 

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics